/**
 * LeetCode 8. 字符串转换整数 (atoi)
 */
public class Solution_8 {
    /**
     * 标记输入是否合法，true 为合法，false 为非法
     */
    boolean validInput = true;

    /**
     * 一次遍历
     * <p>
     * 时间复杂度：O(n)
     * <p>
     * 空间复杂度：O(1)
     */
    public int myAtoi(String s) {
        if (s == null || s.length() == 0) {
            validInput = false;
            return 0;
        }

        int len = s.length();

        int index = 0;
        // 1. 忽略前导空格
        while (index < len && s.charAt(index) == ' ') {
            index++;
        }
        // 2. 防止诸如 " " 的空串
        if (index == len) {
            validInput = false;
            return 0;
        }
        // 3. 符号位
        int sign = 1;
        if (s.charAt(index) == '+') {
            sign = 1;
            index++;
        } else if (s.charAt(index) == '-') {
            sign = -1;
            index++;
        }
        // 4. 遍历字符
        int ans = 0;
        while (index < len) {
            char curChar = s.charAt(index);
            // 非数字字符，退出循环，并标记输入有误
            if (curChar < '0' || curChar > '9') {
                validInput = false;
                break;
            }
            // 检查整型溢出，若溢出则返回边界值，并标记输入有误
            if (ans > Integer.MAX_VALUE / 10
                    || (ans == Integer.MAX_VALUE / 10 && (curChar - '0') > Integer.MAX_VALUE % 10)) {
                validInput = false;
                return Integer.MAX_VALUE;
            }
            if (ans < Integer.MIN_VALUE / 10
                    || (ans == Integer.MIN_VALUE / 10 && (curChar - '0') > -(Integer.MIN_VALUE % 10))) {
                validInput = false;
                return Integer.MIN_VALUE;
            }
            // 合法，进行计算
            ans = ans * 10 + sign * (curChar - '0');
            index++;
        }
        return ans;
    }
}
